#! /usr/bin/python
# -*- coding: utf-8 -*-
#
# eoru2csv.py
#
# Конвертор Эсперанто-Русского словаря Бориса Кондратьева
# из текстового формата в формат CSV для мобильных телефонов с J2ME.
#
# Автор: Егор Чемисов
# Email: yegor.chemisov@gmail.com
# http://ervo.googlecode.com
#
import os
import re
from string import Template

DIR_EO_RU 		= "./eo-ru/"
# Каталог, где находятся исходные текстовые файлы словаря (ĉĈĝĜĥĤĵĴŝŜŭŬ)

DIR_J2ME 		= "./j2me/"
FILE_EXT_TXT            = ".txt"

    
SYMBOLS = (
    ('<<', '«'), ('>>', '»'), ('@', '◊'), (',,',';'), 
    (r'(?<=[^-])\-\-(?=[^-])', r'—'), 
)
CLEANUP = ((r'^\$ .*?$',''),
           ('^20.*?$',''),
           ('{{.*?}}',''), 
           (r'^!!+.*?$',''),
           (r'\n\n+',r'\n\n'),
)

currentRoot = None
# базовая часть для подстановки в слова с тильдой

def subTilde(match):
    global currentRoot
    word = match.group()
    if '|' in word: currentRoot = word[:-1]
    elif '~' not in word: currentRoot = word
    return currentRoot 

TXT2CSV = ((r'[/()_\t`]', r''),                 # Убираем излишнее форматирование
           (r'\n([-\w\d~@◊«=])', r' \1'),       # Собираем статью в одну строку
           (r'((?<=^\[)\w*\|)|~|((?<=^\[)([^]|]*)(?=\]))', subTilde),
           # Заменяем тильду на корень слова
           (r'\n\n+', r'\n'),                   # Убираем пустые строки
           (r'([^;]*)(;.*?)(?=[\n\d])', r'\1. '), # Сокращаем статьи
           (r';', '.'), (r'\[', ''), (r'\]', ';'),
#           (r'\n.*?сомнит\.\..*?\n', '\n'),
)

def main():

    patterns = SYMBOLS + CLEANUP + TXT2CSV    
    for fileName in os.listdir ( DIR_EO_RU ):
        if fileName[0] == '.' : continue
        if fileName[-4:] == FILE_EXT_TXT :
            data = open(DIR_EO_RU + fileName,'r',encoding='cp1251').read()
            for p in patterns:
                data = re.sub(p[0], p[1], data, 0, re.DOTALL | re.MULTILINE)
            open(DIR_J2ME + fileName,'w',encoding='utf8').write(data)
    
    print ("Done!")
    return None
main()

